package com.logreview.util;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * MNTR通信协议
 * 
 * @author 25989
 * 
 */
public class MNTR {
	private static final Logger logger = LoggerFactory.getLogger(MNTR.class);

	/**
	 * MNTR加密<br>
	 * 将databytes从第7个字节开始，每8个字节使用key进行des加密(末尾不足8字节的，不做加密)
	 * 
	 * @return
	 */
	public static byte[] encrypt(byte[] databytes, byte[] key) {
		byte[] transBytes = new byte[databytes.length];
		byte[] temp = new byte[8];
		int tempindex = 0;
		int transIndex = 0;

		// 加密
		int lastIndex = ((databytes.length - 6) - (databytes.length - 6) % 8) + 6; // 最后一个加密字节的下标
		for (int i = 0; i < databytes.length; i++) {
			// 前6位不加密直接copy
			if (i < 6) {
				transBytes[transIndex] = databytes[i];
				transIndex++;
			} else if (i < lastIndex) {// 第7位到最后一个8的倍数位

				temp[tempindex] = databytes[i];
				tempindex++;

				// 每8位加密一次
				if (tempindex > 0 && tempindex % 8 == 0) {
					// 加密，并且放到传输的字节数组中
					logger.debug("加密前的字符串:" + new String(temp));
					byte[] e = DES.encrypt(temp, key);
					logger.debug("加密后的字符串:" + new String(e));
					for (int j = 0; j < e.length; j++) {
						transBytes[transIndex] = e[j];
						transIndex++;
					}
					tempindex = 0;
				}
			} else {// 末尾不满8位的情况copy
				transBytes[transIndex] = databytes[i];
				transIndex++;
			}
		}
		return transBytes;
	}

	/**
	 * MNTR解密<br>
	 * 将databytes从第7个字节开始，每8个字节使用key进行des加密(末尾不足8字节的，不做解密)
	 * 
	 * @return
	 */
	public static byte[] decrypt(byte[] databytes, byte[] key) {
		int acturalLength = databytes.length;
		byte[] decryptData = new byte[acturalLength];// 解密之后的字节流
		int decryptIndex = 0;
		byte[] temp = new byte[8];// 每8个字节解密
		int tempindex = 0;
		int lastIndex = ((acturalLength - 6) - (acturalLength - 6) % 8) + 6; // 最后一个加密字节的下标

		for (int i = 0; i < acturalLength; i++) {
			// 前6位不加密直接copy
			if (i < 6) {
				decryptData[decryptIndex] = databytes[i];
				decryptIndex++;
			} else if (i < lastIndex) {// 第7位到最后一个8的倍数位
				temp[tempindex] = databytes[i];
				tempindex++;
				// 每8位解密一次
				if (tempindex > 0 && tempindex % 8 == 0) {
					// 解密，并且放到解密的字节数组中
					logger.debug("解密前的字符串:" + new String(temp));
					byte[] e = DES.decrypt(temp, key);
					logger.debug("解密后的字符串:" + new String(e));
					for (int j = 0; j < e.length; j++) {
						decryptData[decryptIndex] = e[j];
						decryptIndex++;
					}
					tempindex = 0;
				}
			} else {// 末尾不满8位的情况copy
				decryptData[decryptIndex] = databytes[i];
				decryptIndex++;
			}
		}
		return decryptData;
	}

}
